
var minWindow = function(s, t) {
  let minLen = Infinity, start = -1;

  // 统计需要的东西
  const map = new Map();
  // 需要的字符及其数量
  for (const ch of t) {
    map.set(ch, (map.get(ch) || 0) + 1);
  }
  // 需要的字符种类数
  let kinds = map.size;

  // 当前窗口
  for (let left = 0, right = 0; right < s.length; right++) {
    if (map.has(s[right])) map.set(s[right], map.get(s[right]) - 1);
    if (map.get(s[right]) === 0) kinds--;
    while (kinds === 0) {
      if (minLen > right - left + 1) {
        minLen = right - left + 1;
        start = left;
      }
      // 缩小窗口
      if (map.has(s[left])) map.set(s[left], map.get(s[left]) + 1);
      if (map.get(s[left]) > 0) kinds++;
      left++;
    }
  }

  return start === -1 ? "" : s.substring(start, start + minLen);

};

const s = "ADOBECODEBANC", t = "ABC";
console.log(minWindow(s, t))